/* * Copyright (C) 2010 - 2014. * AHCP Project (http://code.google.com/p/jacp) * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.jacp.demo.components; import java.util.Arrays; import java.util.List; import javafx.collections.FXCollections; import javafx.event.Event; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.chart.BarChart; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart.Data; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jacp.demo.enums.BarChartAction; import org.jacpfx.api.annotations.component.View; import org.jacp.demo.entity.Contact; import org.jacp.demo.main.Util; import org.jacpfx.api.message.Message; import org.jacpfx.rcp.component.FXComponent; import org.jacpfx.rcp.util.FXUtil.MessageUtil; /** * The chart view displays a faked consumer chart for each contact; The chart * data will be generated by the AnalyticsCallback component * * @author Andy Moncsek Patrick Symmangk */ @View(id = "id003", name = "contactDemoChartView", active = true,initialTargetLayoutId ="PmainContentBottom" ) public class ContactChartViewComponent implements FXComponent { private final static Log LOGGER = LogFactory .getLog(ContactChartViewComponent.class); private GridPane root; private CategoryAxis xAxis; private NumberAxis yAxis; private BarChart<String, Number> bc; private XYChart.Series<String, Number> series1; private XYChart.Series<String, Number> series2; private XYChart.Series<String, Number> series3; private XYChart.Series<String, Number> series4; public static final String[] YEARS = { "2006", "2007", "2008", "2009", "2010", "2011" }; @Override public Node handle(final Message<Event, Object> message) throws Exception { if (message.getMessageBody().equals(MessageUtil.INIT)) { this.root = this.createRoot(); this.root.getChildren().add(this.createChart()); } LOGGER.debug("ContactChartViewComponent handlemessage message: "+message.getMessageBody()); return null; } @Override public Node postHandle(final Node node, final Message<Event, Object> message) throws Exception { if (message.getMessageBody() instanceof BarChartAction) { if (BarChartAction.RESET.equals(message.getMessageBody())) { this.clearChartPane(); } } if (message.getMessageBody() instanceof Contact) { final Contact contact = (Contact) message.getMessageBody(); this.refreshChartPane(contact); final List<Data<String, Number>> data = contact.getDto() .getSeriesOneData(); this.addData(this.series1, data); this.addData(this.series2, contact.getDto().getSeriesTwoData()); this.addData(this.series3, contact.getDto().getSeriesThreeData()); this.addData(this.series4, contact.getDto().getSeriesFourData()); } return this.root; } private GridPane createRoot() { final GridPane myRoot = new GridPane(); myRoot.getStyleClass().addAll("dark", "bar-chart-root"); myRoot.setAlignment(Pos.CENTER); GridPane.setHgrow(myRoot, Priority.ALWAYS); GridPane.setVgrow(myRoot, Priority.ALWAYS); return myRoot; } protected BarChart<String, Number> createChart() { this.xAxis = new CategoryAxis(); this.yAxis = new NumberAxis(); this.yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter( this.yAxis, "$", null)); this.bc = new BarChart<String, Number>(this.xAxis, this.yAxis); this.bc.setAnimated(true); this.bc.setTitle(" "); this.xAxis.getStyleClass().add("jacp-bar"); this.yAxis.getStyleClass().add("jacp-bar"); this.xAxis.setLabel("Year"); this.yAxis.setLabel("Price"); this.series1 = new XYChart.Series<String, Number>(); this.series1.setName("electronic"); this.series2 = new XYChart.Series<String, Number>(); this.series2.setName("clothes"); this.series3 = new XYChart.Series<String, Number>(); this.series3.setName("hardware"); this.series4 = new XYChart.Series<String, Number>(); this.series4.setName("books"); GridPane.setHalignment(this.bc, HPos.CENTER); GridPane.setVgrow(this.bc, Priority.ALWAYS); GridPane.setHgrow(this.bc, Priority.ALWAYS); GridPane.setMargin(this.bc, new Insets(0, 6, 0, 0)); return this.bc; } private void refreshChartPane(final Contact contact) { this.root.getChildren().clear(); this.bc = this.createChart(); this.root.getChildren().add(this.bc); this.bc.setTitle(contact.getFirstName() + " " + contact.getLastName() + " consumer Chart"); this.xAxis.setCategories(FXCollections .<String> observableArrayList(Arrays.asList(Util.YEARS))); } private void clearChartPane() { this.root.getChildren().clear(); this.bc = this.createChart(); this.root.getChildren().add(this.bc); } private void addData(final XYChart.Series<String, Number> series, final List<Data<String, Number>> data) { this.bc.getData().add(series); series.getData().addAll(data); } }